/**
 * 统一加载状态管理
 * 提供页面级别的加载状态管理
 */

class LoadingManager {
  /**
   * 创建加载状态管理器
   * @param {Object} context - 页面上下文（this）
   * @param {String} loadingKey - 加载状态的data key，默认'loading'
   */
  constructor(context, loadingKey = 'loading') {
    this.context = context;
    this.loadingKey = loadingKey;
    this.loadingCount = 0; // 支持多个并发请求
  }

  /**
   * 开始加载
   * @param {Object} options - 配置选项
   * @param {Boolean} options.showToast - 是否显示Toast，默认false
   * @param {String} options.toastText - Toast文字，默认'加载中...'
   */
  start(options = {}) {
    this.loadingCount++;
    
    const { showToast = false, toastText = '加载中...' } = options;
    
    if (this.context && typeof this.context.setData === 'function') {
      this.context.setData({
        [this.loadingKey]: true
      });
    }

    if (showToast) {
      wx.showLoading({
        title: toastText,
        mask: true
      });
    }
  }

  /**
   * 结束加载
   * @param {Object} options - 配置选项
   * @param {Boolean} options.hideToast - 是否隐藏Toast，默认false
   */
  stop(options = {}) {
    this.loadingCount = Math.max(0, this.loadingCount - 1);
    
    const { hideToast = false } = options;
    
    if (this.loadingCount === 0) {
      if (this.context && typeof this.context.setData === 'function') {
        this.context.setData({
          [this.loadingKey]: false
        });
      }

      if (hideToast) {
        wx.hideLoading();
      }
    }
  }

  /**
   * 执行异步操作，自动管理加载状态
   * @param {Function} asyncFn - 异步函数
   * @param {Object} options - 配置选项
   * @returns {Promise} 异步操作的结果
   */
  async execute(asyncFn, options = {}) {
    this.start(options);
    try {
      const result = await asyncFn();
      return result;
    } finally {
      this.stop(options);
    }
  }

  /**
   * 重置加载状态
   */
  reset() {
    this.loadingCount = 0;
    if (this.context && typeof this.context.setData === 'function') {
      this.context.setData({
        [this.loadingKey]: false
      });
    }
    wx.hideLoading();
  }
}

module.exports = LoadingManager;

